```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SpringMVC 全面指南 | 技术小馆</title>
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            line-height: 1.8;
            color: #333;
            background-color: #f9f9f9;
        }
        .hero {
            background: linear-gradient(135deg, #6e8efb, #a777e3);
            color: white;
        }
        .card {
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            border-radius: 12px;
            overflow: hidden;
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
        }
        .nav-item {
            position: relative;
        }
        .nav-item::after {
            content: '';
            position: absolute;
            bottom: -2px;
            left: 0;
            width: 0;
            height: 2px;
            background: #6e8efb;
            transition: width 0.3s ease;
        }
        .nav-item:hover::after {
            width: 100%;
        }
        .code-block {
            background: #2d2d2d;
            color: #f8f8f2;
            border-radius: 8px;
            font-family: 'Courier New', Courier, monospace;
        }
        .highlight {
            background: rgba(110, 142, 251, 0.1);
            border-left: 4px solid #6e8efb;
            padding: 1rem;
            border-radius: 0 4px 4px 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero py-20 px-4 sm:px-6 lg:px-8">
        <div class="max-w-7xl mx-auto text-center">
            <h1 class="text-4xl md:text-5xl font-bold mb-6">SpringMVC 全面指南</h1>
            <p class="text-xl md:text-2xl mb-8">从入门到精通，掌握现代Java Web开发的核心框架</p>
            <div class="flex justify-center space-x-4">
                <a href="#overview" class="bg-white text-indigo-600 px-6 py-3 rounded-lg font-medium hover:bg-gray-100 transition duration-300">
                    <i class="fas fa-book-open mr-2"></i>开始学习
                </a>
                <a href="#examples" class="bg-indigo-700 text-white px-6 py-3 rounded-lg font-medium hover:bg-indigo-800 transition duration-300">
                    <i class="fas fa-code mr-2"></i>查看示例
                </a>
            </div>
        </div>
    </div>

    <!-- Navigation -->
    <nav class="sticky top-0 bg-white shadow-md z-10">
        <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
            <div class="flex justify-between h-16">
                <div class="flex space-x-8">
                    <a href="#overview" class="nav-item text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">概述</a>
                    <a href="#mvc" class="nav-item text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">MVC架构</a>
                    <a href="#setup" class="nav-item text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">环境搭建</a>
                    <a href="#parameters" class="nav-item text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">参数处理</a>
                    <a href="#rest" class="nav-item text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">REST风格</a>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-gray-700 hover:text-indigo-600 px-3 py-2 font-medium">
                        <i class="fas fa-external-link-alt mr-1"></i>技术小馆
                    </a>
                </div>
            </div>
        </div>
    </nav>

    <!-- Main Content -->
    <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
        <!-- Overview Section -->
        <section id="overview" class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-info-circle text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">一、SpringMVC 介绍</h2>
            </div>
            
            <div class="card bg-white p-6 mb-8">
                <p class="text-lg text-gray-700 mb-4">
                    Spring MVC 是 Spring 框架中的一个模块，用于构建基于 Java 的 Web 应用程序。它基于 MVC（Model-View-Controller）架构模式，提供了一种灵活而强大的方式来开发 Web 应用程序。
                </p>
                <div class="grid md:grid-cols-3 gap-6 mt-6">
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-link-slash mr-2"></i>松耦合性
                        </h3>
                        <p>Spring MVC 鼓励开发者将应用程序的各个部分分开，使得模型、视图和控制器之间的耦合度降低，代码更易于理解、测试和维护。</p>
                    </div>
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-sliders-h mr-2"></i>灵活性
                        </h3>
                        <p>Spring MVC 提供了丰富的配置选项和扩展点，允许开发者根据需求定制和扩展框架的行为，满足不同应用场景的需求。</p>
                    </div>
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-bolt mr-2"></i>易用性
                        </h3>
                        <p>Spring MVC 提供了一套简洁而强大的 API，使得开发者能够快速地构建出高质量的 Web 应用程序，并且易于集成到现有的 Spring 或 Java EE 应用中。</p>
                    </div>
                </div>
                <div class="mt-8">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1709799342208-029532ef-39f9-42ab-9928-c8355018109c.png" alt="Spring MVC架构图" class="w-full rounded-lg shadow-md">
                </div>
            </div>
        </section>

        <!-- MVC Architecture Section -->
        <section id="mvc" class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-sitemap text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">二、MVC架构</h2>
            </div>
            
            <div class="card bg-white p-6 mb-8">
                <p class="text-lg text-gray-700 mb-6">
                    MVC（Model-View-Controller）是一种软件架构模式，用于设计和组织应用程序的代码。它将应用程序分为三个主要部分：
                </p>
                
                <div class="grid md:grid-cols-3 gap-6 mb-8">
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-database mr-2"></i>模型（Model）
                        </h3>
                        <p>模型负责管理应用程序的数据和业务逻辑。它表示应用程序的数据结构，处理数据的读取、存储、验证和操作等任务。</p>
                    </div>
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-eye mr-2"></i>视图（View）
                        </h3>
                        <p>视图负责显示模型的数据给用户，并接受用户的输入。它是用户界面的呈现部分，负责与用户交互。</p>
                    </div>
                    <div class="highlight">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-600 flex items-center">
                            <i class="fas fa-cogs mr-2"></i>控制器（Controller）
                        </h3>
                        <p>控制器是模型和视图之间的中介，负责处理用户的输入并更新模型和视图之间的关系。它接收用户的请求，处理请求并调度适当的操作。</p>
                    </div>
                </div>
                
                <div class="mt-6">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1709799510376-18d63698-bb67-4754-896f-ad2afbbad8d5.png" alt="MVC架构图" class="w-full rounded-lg shadow-md">
                </div>
                
                <div class="mt-8 bg-blue-50 p-6 rounded-lg">
                    <h4 class="text-xl font-semibold mb-3 text-blue-700 flex items-center">
                        <i class="fas fa-lightbulb mr-2"></i>MVC模式的优势
                    </h4>
                    <p class="text-gray-700">
                        MVC模式的优势在于将应用程序的不同功能分离开来，使得代码更加模块化、可维护和可扩展。它提供了清晰的结构，使开发人员可以更容易地理解和管理应用程序的各个部分。
                    </p>
                </div>
            </div>
        </section>

        <!-- Environment Setup Section -->
        <section id="setup" class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-cogs text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">三、环境搭建</h2>
            </div>
            
            <div class="card bg-white p-6 mb-8">
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">3.1 导入依赖</h3>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
    &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
    &lt;version&gt;6.1.6&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">3.2 配置核心(前端)控制器</h3>
                <p class="mb-4">
                    作为一个MVC框架，首先要解决的是：如何能够收到请求！所以MVC框架大都会设计一款前端控制器，选型在 Servlet 或 Filter两者之一,在框架最前沿率先工作，接收所有请求。此控制器在接收到请求后，还会负责springMVC的核心的调度管理，所以既是前端又是核心。
                </p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-xml">&lt;servlet&gt;
    &lt;servlet-name&gt;mvc&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
    &lt;!-- 局部参数：声明配置文件位置 --&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
        &lt;param-value&gt;classpath:mvc.xml&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;!-- Servlet启动时刻：可选 --&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;mvc&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</code></pre>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">3.3 后端控制器</h3>
                <p class="mb-4">等价于之前定义的Servlet</p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-java">@Controller //声明这是一个控制器
@RequestMapping("/hello")  //访问路径 ，等价于url-pattern
public class HelloController {
    @RequestMapping("/test1")  //访问路径
    public String hello1(){
        System.out.println("hello world");
        return "index"; // 跳转:/index.jsp  
    }
    @RequestMapping("/test2") //访问路径
    public String hello2(){
        System.out.println("hello c9");
        return "views/users";//  跳转:/views/user.jsp
    }
}</code></pre>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">3.4 配置文件</h3>
                <p class="mb-2">默认名称：核心控制器名-servet.xml 默认位置：WEB-INF</p>
                <p class="mb-4">随意名称：mvc.xml 随意位置：resources 但需要配置在核心控制器中</p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-xml">&lt;beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd"&gt;

    &lt;!-- 告知springmvc  哪些包中 存在 被注解的类 --&gt;
    &lt;context:component-scan base-package="com.ts.controller"&gt;&lt;/context:component-scan&gt;
    &lt;!-- 注册注解开发驱动 --&gt;
    &lt;mvc:annotation-driven&gt;&lt;/mvc:annotation-driven&gt;
    &lt;!-- 视图解析器
         作用：1.捕获后端控制器的返回值="index"
              2.解析： 在返回值的前后 拼接 ==&gt; "/index.jsp"
     --&gt;
    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
        &lt;!-- 前缀 --&gt;
        &lt;property name="prefix" value="/"&gt;&lt;/property&gt;
        &lt;!-- 后缀 --&gt;
        &lt;property name="suffix" value=".jsp"&gt;&lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</code></pre>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">3.5 访问</h3>
                <div class="code-block p-4 rounded-lg">
                    <pre class="text-sm"><code class="language-http">http://localhost：8989/hello/test1
http://localhost：8989/hello/test2</code></pre>
                </div>
            </div>
        </section>

        <!-- Parameters Handling Section -->
        <section id="parameters" class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-sign-in-alt text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">四、接收请求参数</h2>
            </div>
            
            <div class="card bg-white p-6">
                <p class="text-lg text-gray-700 mb-6">
                    通过控制器中方法的形参接收请求参数
                </p>
                
                <div class="space-y-12">
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.1 基本类型参数</h3>
                        <p class="mb-4">请求参数和方法的形参同名即可</p>
                        <p class="mb-4">springMVC默认可以识别的日期字符串格式为：YYYY/MM/dd HH:mm:ss<br>
                            通过@DateTimeFormat可以修改默认日志格式</p>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-java">@RequestMapping("/test1")
public String testParam1(Integer id,
                        String name,
                        Boolean gender,
                        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date birth){
    System.out.println("test param1");
    return "index";
}</code></pre>
                        </div>
                    </div>
                    
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.2 实体收参(建议)</h3>
                        <p class="mb-4">请求参数和实体的属性同名即可</p>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-java">public class User {
    private Integer id;
    private String name;
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birth;
    private Boolean gender;
    //set/get ...
}

//http://localhost:8989/.../test2?id=1&name=zzz&gender=false&birth=2018-12-12 12:20:30
@RequestMapping("/test2")
public String testParam2(User user){
    System.out.println("test param2");
    System.out.println("user:"+user);
    return "index";
}</code></pre>
                        </div>
                    </div>
                    
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.3 数组收参</h3>
                        <p class="mb-2">简单类型的数组</p>
                        
                        <div class="code-block p-4 rounded-lg mb-4">
                            <pre class="text-sm"><code class="language-html">&lt;form&gt;
    ......
    &lt;input type="checkbox" name="hobby" value="fb"/&gt;足球 
    &lt;input type="checkbox" name="hobby" value="bb"/&gt;篮球 
    &lt;input type="checkbox" name="hobby" value="vb"/&gt;排球
    
&lt;/form&gt;</code></pre>
                        </div>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-java">//http://localhost:8989/.../test3?hobby=football&hobby=basketball
@RequestMapping("/test3")
public String testParam3(String[] hobby){
    for(String h:hobby){
        System.out.print(h+" ");
    }
    return "index";
}</code></pre>
                        </div>
                    </div>
                    
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.4 集合收参 （了解）</h3>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-java">public class VO {
    //private User[] users;
    private List&lt;User&gt; users;
    //set/get..
}

// &lt;input type="text" name="users[0].id"/&gt;
//http://...?users[0].id=1&users[0].name=zhangsan&users[0].birth=2018-12-12&users[1].id=2&....
@RequestMapping("/test4")
public String testParam4(VO9 vo){
    for(User user:vo.getUsers()){
        System.out.println(user);
    }
    return "index";
}</code></pre>
                        </div>
                    </div>
                    
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.5 路径参数</h3>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-java">@RequestMapping("/hello/{id}")
public String testParam5(@PathVariable("id") Integer id){
    System.out.println("id:"+id);            
    return "index";
}</code></pre>
                        </div>
                    </div>
                    
                    <div>
                        <h3 class="text-2xl font-semibold mb-4 text-gray-800">4.6 中文乱码</h3>
                        <p class="mb-2"><strong>首先，页面中字符集统一</strong></p>
                        
                        <div class="code-block p-4 rounded-lg mb-4">
                            <pre class="text-sm"><code class="language-plain">JSP : &lt;%@page  pageEncoding="utf-8" %&gt;
HTML : &lt;meta charset="UTF-8"&gt;</code></pre>
                        </div>
                        
                        <p class="mb-2"><strong>其次，tomcat中字符集设置，对get请求中，中文参数乱码有效</strong></p>
                        
                        <div class="code-block p-4 rounded-lg mb-4">
                            <pre class="text-sm"><code class="language-markdown">Tomcat配置：URIEncoding=utf-8</code></pre>
                        </div>
                        
                        <p class="mb-2"><strong>最后，设置此filter，对post请求中，中文参数乱码有效</strong></p>
                        
                        <div class="code-block p-4 rounded-lg">
                            <pre class="text-sm"><code class="language-xml">&lt;!-- 此过滤器会进行：request.setCharactorEncoding("utf-8"); --&gt;
&lt;filter&gt;
    &lt;filter-name&gt;encoding&lt;/filter-name&gt;
    &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
        &lt;param-value&gt;utf-8&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;encoding&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</code></pre>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <!-- REST Section -->
        <section id="rest" class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-exchange-alt text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">五、REST【重点】</h2>
            </div>
            
            <div class="card bg-white p-6">
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">5.1 开发风格</h3>
                <p class="mb-4"><strong>是一种开发风格，遵从此风格开发软件，是restful的。</strong></p>
                
                <div class="bg-gray-50 p-6 rounded-lg mb-6">
                    <ul class="list-disc pl-6 space-y-2">
                        <li><strong>每个资源都有自己的标识</strong><br>
                            <a href="http://localhost:8989/xxx/users" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users</a><br>
                            <a href="http://localhost:8989/xxx/users/1" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1</a><br>
                            <a href="http://localhost:8989/xxx/users/1/orders" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1/orders</a>
                        </li>
                        <li><strong>每个请求都有明确的动词 ( GET, POST, PUT, DELETE )</strong><br>
                            GET : <a href="http://localhost:8989/xxx/users" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users</a> 查询所有用户<br>
                            POST: <a href="http://localhost:8989/xxx/users" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users</a> 增加一个用户<br>
                            PUT : <a href="http://localhost:8989/xxx/users/1" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1</a> 修改用户1<br>
                            DELETE : <a href="http://localhost:8989/xxx/users/1" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1</a> 删除用户1<br><br>
                            
                            GET: <a href="http://localhost:8989/xxx/users/1/orders" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1/orders</a> 查询用户1的订单<br>
                            POST: <a href="http://localhost:8989/xxx/users/1/orders" class="text-blue-600 hover:underline">http://localhost:8989/xxx/users/1/orders</a> 为用户1增加一个订单
                        </li>
                    </ul>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">5.2 优点</h3>
                <ul class="list-disc pl-6 space-y-2 mb-6">
                    <li><strong>看Url就知道要什么</strong></li>
                    <li><strong>看http method就知道干什么</strong></li>
                </ul>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">5.3 使用</h3>
                
                <div class="mb-8">
                    <h4 class="text-xl font-semibold mb-4 text-gray-700">5.3.1 定义Rest风格的 Controller</h4>
                    <p class="mb-2">@RequestMapping(value="/users",method = RequestMethod.GET)</p>
                    <p class="mb-4"><strong>等价</strong><br>
                    @GetMapping("/users")</p>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-java">@RestController
public class RestController {
    @GetMapping("/users")
    public List&lt;User&gt; queryAllUsers(){
        System.out.println("get");
        List&lt;User&gt; users = ....
        return users;
    }

    @PostMapping("/users")
    public String addUser(@RequestBody User user){
        System.out.println("Post user :"+user);
        return "{status:1}";
    }
    
    @PutMapping("/users")
    public String updateUser(@RequestBody User user){
        System.out.println("Put user" user:"+user);
        return "{status:1}";
    }

    @GetMapping("/users/{id}")
    public String queryOneUser(@PathVariable Integer id){//@PathVariable 接收路径中的值
        System.out.println("Get user id:"+id);
        return "{status:1}";
    }

    @DeleteMapping("/users/{id}")
    public String deleteOneUser(@PathVariable Integer id){//@PathVariable 接收路径中的值
        System.out.println("delete user id:"+id);
        return "{status:1}";
    }
}</code></pre>
                    </div>
                </div>
                
                <div>
                    <h4 class="text-xl font-semibold mb-4 text-gray-700">5.3.2 Ajax请求</h4>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-html">&lt;script&gt;    
    function putUser(){ // 发送更新请求 （增加请求发送方式也是如此）
        var xhr = new XMLHttpRequest();
        //定义 put，delete,get,post方式 即可，不用定义_method
        xhr.open("put","${pageContext.request.contextPath}/rest04/users");
        // 设置请求头
        xhr.setRequestHeader("content-type","application/json")；
        // 设置请求参数
        var user = {id:1，NAME:"shine"，city:"bj"，"birth":"2020/12/12"，"salary":100.5};
        xhr.send(JSON.stringify(user));
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4 && xhr.status==200){
                var ret = xhr.responseText;
                // 解析json，并输出
                console.log(JSON.parse(ret));
            }
        }
        /*$.ajax({
            url:'${pageContext.request.contextPath}/rest04/users',
            type:'put',
            contentType:"application/json",//声明请求参数类型为 json
            data:JSON.stringify(user),// 转换js对象成json
            success:function(ret){
                console.log(JSON.parse(ret));
            }
        });*/
    }

    function delUser(){  // 发送删除请求
        var xhr = new XMLHttpRequest();
        //定义 put，delete,get,post方式 即可，不用定义_method
        xhr.open("delete","${pageContext.request.contextPath}/rest04/users/1");
        xhr.send();
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4 && xhr.status==200){
                var ret = xhr.responseText;
                console.log(JSON.parse(ret));
            }
        }
    }
&lt;/script&gt;</code></pre>
                    </div>
                </div>
            </div>
        </section>

        <!-- SpringMVC Process Section -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-project-diagram text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">六、SpringMVC执行流程</h2>
            </div>
            
            <div class="card bg-white p-6">
                <img src="https://cdn.nlark.com/yuque/0/2023/png/21449790/1692180510609-66596caa-94ed-444c-b3ae-23166545c634.png" alt="SpringMVC执行流程" class="w-full rounded-lg shadow-md">
            </div>
        </section>

        <!-- Thymeleaf Section -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <div class="bg-indigo-100 p-3 rounded-full mr-4">
                    <i class="fas fa-code text-indigo-600 text-xl"></i>
                </div>
                <h2 class="text-3xl font-bold text-gray-800">七、SpringMVC整合Thymeleaf</h2>
            </div>
            
            <div class="card bg-white p-6">
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">7.1 Thymeleaf简介</h3>
                <p class="mb-4">
                    Thymeleaf 是新一代 Java 模板引擎，与 Velocity、FreeMarker 等传统 Java 模板引擎不同，Thymeleaf 支持 HTML 原型，其文件后缀为".html"，因此它可以直接被浏览器打开，此时浏览器会忽略未定义的 Thymeleaf 标签属性，展示 thymeleaf 模板的静态页面效果；当通过 Web 应用程序访问时，Thymeleaf 会动态地替换掉静态内容，使页面动态显示。
                </p>
                
                <p class="mb-4">
                    Thymeleaf 通过在 html 标签中，增加额外属性来达到"模板+数据"的展示方式，示例代码如下。
                </p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en" xmlns:th="http://www.thymeleaf.org"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Title&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!--th:text 为 Thymeleaf 属性，用于在展示文本--&gt;
&lt;h1 th:text="迎您来到Thymeleaf"&gt;欢迎您访问静态页面 HTML&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
                </div>
                
                <p class="mb-4">
                    当直接使用浏览器打开时，浏览器展示结果如下。
                </p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-plain">欢迎您访问静态页面HTML</code></pre>
                </div>
                
                <p class="mb-4">
                    当通过 Web 应用程序访问时，浏览器展示结果如下。
                </p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-plain">迎您来到Thymeleaf</code></pre>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">7.2 环境搭建</h3>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 text-gray-700">1、导入依赖</h4>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.thymeleaf&lt;/groupId&gt;
    &lt;artifactId&gt;thymeleaf-spring5&lt;/artifactId&gt;
    &lt;version&gt;3.0.13.RELEASE&lt;/version&gt;
&lt;/dependency&gt;

&lt;!-- spring6依赖 --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.thymeleaf&lt;/groupId&gt;
    &lt;artifactId&gt;thymeleaf-spring6&lt;/artifactId&gt;
    &lt;version&gt;3.1.0.RELEASE&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 text-gray-700">2、配置thymeleaf视图解析器</h4>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-xml">&lt;!-- 配置Thymeleaf视图解析器 --&gt;
&lt;bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"&gt;
    &lt;property name="order" value="1"/&gt;
    &lt;property name="characterEncoding" value="UTF-8"/&gt;
    &lt;property name="templateEngine"&gt;
        &lt;bean class="org.thymeleaf.spring5.SpringTemplateEngine"&gt;
            &lt;property name="templateResolver"&gt;
                &lt;bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"&gt;
                    &lt;!-- 视图前缀 --&gt;
                    &lt;property name="prefix" value="/"/&gt;

                    &lt;!-- 视图后缀 --&gt;
                    &lt;property name="suffix" value=".html"/&gt;
                    &lt;property name="templateMode" value="HTML5"/&gt;
                    &lt;property name="characterEncoding" value="UTF-8" /&gt;
                &lt;/bean&gt;
            &lt;/property&gt;
        &lt;/bean&gt;
    &lt;/property&gt;
&lt;/bean&gt;


&lt;!-- spring6Thymeleaf试图解析器--&gt;
&lt;bean id="springResourceTemplateResolver" class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver"&gt;
    &lt;property name="prefix" value="/templates/"/&gt;
    &lt;property name="suffix" value=".html"/&gt;
    &lt;property name="templateMode" value="HTML"/&gt;
    &lt;property name="characterEncoding" value="UTF-8"/&gt;
&lt;/bean&gt;

&lt;bean id="templateEngine" class="org.thymeleaf.spring6.SpringTemplateEngine"&gt;
    &lt;property name="templateResolver" ref="springResourceTemplateResolver"/&gt;
&lt;/bean&gt;
&lt;bean id="viewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver"&gt;
    &lt;property name="order" value="1"/&gt;
    &lt;property name="characterEncoding" value="UTF-8"/&gt;
    &lt;property name="templateEngine" ref="templateEngine"/&gt;
&lt;/bean&gt;</code></pre>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 text-gray-700">3、定义页面(index.html)</h4>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en" xmlns:th="http://www.thymeleaf.org/"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Title&lt;/title&gt;
    &lt;base th:href="${#servletContext.getContextPath()+'/'}"&gt;
&lt;/head&gt;
&lt;body&gt;
index&lt;br&gt;
&lt;span th:text="动态内容"&gt;静态内容&lt;/span&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 text-gray-700">4、定义controlelr</h4>
                    
                    <div class="code-block p-4 rounded-lg">
                        <pre class="text-sm"><code class="language-java">@Controller
public class ThymeleafController {

    @GetMapping("/hello")
    public String hello(ModelMap modelMap) {
        modelMap.put("key", "value");
        return "index";
    }
}</code></pre>
                    </div>
                </div>
                
                <div class="mb-6">
                    <h4 class="text-xl font-semibold mb-3 text-gray-700">5、访问</h4>
                    <div class="flex space-x-4">
                        <div class="w-1/2">
                            <img src="https://cdn.nlark.com/yuque/0/2023/png/21449790/1692180386189-9a17df74-c6a7-4922-a6ef-e0241ccf3a34.png" alt="Thymeleaf访问示例1" class="w-full rounded-lg shadow-md">
                        </div>
                        <div class="w-1/2">
                            <img src="https://cdn.nlark.com/yuque/0/2023/png/21449790/1692180386272-14625dac-4e2f-4af2-a04d-376e694de87b.png" alt="Thymeleaf访问示例2" class="w-full rounded-lg shadow-md">
                        </div>
                    </div>
                </div>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">7.3 Thymeleaf 的特点</h3>
                <p class="mb-4">
                    Thymeleaf 模板引擎具有以下特点：
                </p>
                
                <ul class="list-disc pl-6 space-y-2 mb-6">
                    <li><strong>动静结合</strong>：Thymeleaf 既可以直接使用浏览器打开，查看页面的静态效果，也可以通过 Web 应用程序进行访问，查看动态页面效果。</li>
                    <li><strong>开箱即用</strong>：Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块，可以快速的实现表单绑定、属性编辑器、国际化等功能。</li>
                    <li><strong>多方言支持</strong>：它提供了 Thymeleaf 标准和 Spring 标准两种方言，可以直接套用模板实现 JSTL、 OGNL 表达式；必要时，开发人员也可以扩展和创建自定义的方言。</li>
                    <li><strong>与 SpringBoot 完美整合</strong>：SpringBoot 为 Thymeleaf 提供了的默认配置，并且还为 Thymeleaf 设置了视图解析器，因此 Thymeleaf 可以与 Spring Boot 完美整合。</li>
                </ul>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">7.4 Thymeleaf 语法规则</h3>
                <p class="mb-4">
                    在使用 Thymeleaf 之前，首先要在页面的 html 标签中声明名称空间，示例代码如下。
                </p>
                
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm"><code class="language-html">&lt;html lang="en" xmlns:th="http://www.thymeleaf.org/"&gt;</code></pre>
                </div>
                
                <p class="mb-4">
                    Thymeleaf 作为一种模板引擎，它拥有自己的语法规则。Thymeleaf 语法分为以下 2 类：
                </p>
                
                <ul class="list-disc pl-6 space-y-2 mb-6">
                    <li><strong>标准表达式语法</strong>：${}</li>
                    <li><strong>th 属性</strong>：th:text, th:value 等</li>
                </ul>
                
                <h3 class="text-2xl font-semibold mb-6 text-gray-800 border-b pb-2">7.5 Thymeleaf常用操作</h3>
                
                <div class="code-block p-4 rounded-lg">
                    <pre class="text-sm"><code class="language-html">// 1.引入命名空间
&lt;html lang="en" xmlns:th="http://www.thymeleaf.org/"&gt;
    
// 2.从域对象中取值
req:&lt;span th:text="${reqKey}"&gt;&lt;/span&gt;&lt;br&gt;
session:&lt;span th:text="${session.sessionKey}"&gt;&lt;/span&gt;&lt;br&gt;
application:&lt;span th:text="${application.applicationKey}"&gt;&lt;/span&gt;&lt;br&gt;
内置对象:&lt;span th:text="${#request.getAttribute('reqKey')}"&gt;&lt;/span&gt;
    
// 3.thymeleaf其他常用操作
&lt;base th:href="${#request.getContextPath()+'/'}"&gt;

&lt;td th:text="${#dates.format(user.createTime,'yyyy-MM-dd')}"&gt;&lt;/td&gt;

&lt;input type="hidden" name="id" th:value="${user.id}" &gt;

th:onclick="|admin_edit('user/getUserById/${user.id}')|"

&lt;p class="miaoshu" th:utext="${goods.ginfo}"&gt;&lt;/p&gt;

&lt;tr th:each="topic:${page.list}"&gt;

&lt;span th:text="${sex ==1?'男':'女'}"&gt;&lt;/span&gt;

&lt;span th:text="${#numbers.formatDecimal(price,4,3)}"&gt;&lt;/span&gt;
#numbers.formatDecimal(numbwe,整数位,小数位)。
整数位表示,整数位不足四位,用0补齐

&lt;img th:each="img:${#strings.listSplit(gg.gimage,'|')}" th:src="${img}"&gt;

&lt;div th:switch="${age}"&gt;
    &lt;p th:case="10"&gt;10岁&lt;/p&gt;
    &lt;p th:case="20"&gt;20岁&lt;/p&gt;
    &lt;p th:case="*"&gt;大于30岁(默认值)&lt;/p&gt; 
&lt;/div&gt;

&lt;script th:inline="javascript"&gt;
    var message = [[${user.username}]];
    var username=[[${#request.getParameter('returnUrl')}]];
    console.log(message);
&lt;/script&gt;</code></pre>
                </div>
            </div>
        </section>
    </div>

    <!-- Footer -->
    <footer class="bg-gray-900 text-white py-8">
        <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-4 md:mb-0">
                    <h3 class="text-xl font-bold">技术小馆</h3>
                    <p class="text-gray-400 mt-2">分享前沿技术，传递开发知识</p>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-gray-300 hover:text-white transition duration-300">
                        <i class="fas fa-external-link-alt mr-1"></i>技术小馆地址：http://www.yuque.com/jtostring
                    </a>
                </div>
            </div>
            <div class="mt-8 pt-8 border-t border-gray-800 text-center text-gray-400 text-sm">
                &copy; 2024 技术小馆. All rights reserved.
            </div>
        </div>
    </footer>

    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default'
        });
    </script>
    <script>
        // 滚动时高亮导航项
        const sections = document.querySelectorAll('section');
        const navItems = document.querySelectorAll('.nav-item');
        
        window.addEventListener('scroll', () => {
            let current = '';
            
            sections.forEach(section => {
                const sectionTop = section.offsetTop;
                const sectionHeight = section.clientHeight;
                
                if (pageYOffset >= sectionTop - 300) {
                    current = section.getAttribute('id');
                }
            });
            
            navItems.forEach(item => {
                item.classList.remove('text-indigo-600');
                if (item.getAttribute('href').includes(current)) {
                    item.classList.add('text-indigo-600');
                }
            });
        });
    </script>
</body>
</html>
```